const { PropertyModel, OrderModel } = require('../../models/index')
const { Op } = require('sequelize')

// 获取用户看房预约记录
const getOrderInfo = async (req, res) => {
  try {
    // 获取页码和每页大小
    const { pageSize, page } = req.query

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(pageSize, 10)) || isNaN(parseInt(page, 10)) || pageSize < 0 || page < 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    const orderInfo = await OrderModel.findAndCountAll({
      include: [{
        model: PropertyModel,
        as: 'property',
        attributes: ['id', 'title', 'address', 'price']
      }],
      order: [
        ['updatedAt', 'DESC'],
        ['createdAt', 'DESC']
      ],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 没有找到预约信息的情况
    if (orderInfo.length === 0) {
      return res.status(404).json({ error: '没有找到预约信息！' })
    }

    // 返回预约信息查找成功时的响应
    res.status(200).json({
      title: '查询成功',
      data: orderInfo
    })

  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 修改预约状态
const changeOrderStatus = async (req, res) => {
  try {
    // 获取预约信息的ID
    const id = req.params.id

    // 接收需要更改的状态信息
    const status = req.query.status

    // 预约信息ID为空的情况
    if (!id) {
      return res.status(400).json({ error: '预约信息ID不能为空' })
    }

    // 预约状态为空的情况
    if (!status) {
      return res.status(400).json({ error: '预约状态不能为空' })
    }

    // 验证status是否在允许的列表中
    const statusList = ['已完成', '同意', '拒绝', '待处理']
    if (!statusList.includes(status)) {
      return res.status(400).json({ error: '无效的预约状态' })
    }

    const orderItem = await OrderModel.findByPk(id)

    // 没有找到预约记录的情况
    if (!orderItem) {
      return res.status(404).json({ error: '没有找到预约信息！' })
    }

    // 预约状态已经存在的情况
    if (orderItem.status === status) {
      return res.status(400).json({ error: '预约状态已经存在，无需修改！' })
    }

    // 修改预约记录的状态
    const updateOrder = orderItem.update({ status: status })

    // 返回预约信息查找成功时的响应
    res.status(200).json({
      title: '修改成功',
      message: '已经成功修改该条预约记录的状态!'
    })

  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 删除预约记录
const deleteOrder = async (req, res) => {
  try {
    // 获取预约记录ID
    const id = req.params.id

    // 预约信息ID为空的情况
    if (!id) {
      return res.status(400).json({ error: '预约信息ID不能为空' })
    }

    const orderItem = await OrderModel.findByPk(id)

    // 没有找到预约记录的情况
    if (!orderItem) {
      return res.status(404).json({ error: '没有找到预约信息！' })
    }

    // 删除预约记录
    const delOrderInfo = await orderItem.destroy()

    // 删除成功的响应
    res.status(200).json({
      title: '删除成功',
      message: '该预约记录已经成功删除！'
    })
  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

// 统计看房预约总数
const orderCount = async (req, res) => {
  try {
    const orderCountValue = await OrderModel.count()

    // 统计成功返回响应
    res.status(200).json({
      title: '看房预约总数',
      data: orderCountValue
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

// 搜索预约记录
const searchOrder = async (req, res) => {
  try {
    // 获取用户输入的搜索词
    const searchText = req.query.data

    // 如果搜索词为空返回空数组
    if (!searchText || searchText.trim() === '') {
      return res.status(200).json([])
    }

    // 搜索匹配内容
    const orderItem = await OrderModel.findAll({
      where: {
        [Op.or]: [
          { user_name: { [Op.like]: `%${searchText}%` } },
          { user_phone: { [Op.like]: `%${searchText}%` } },
          { user_email: { [Op.like]: `%${searchText}%` } },
          { user_remarks: { [Op.like]: `%${searchText}%` } },
        ]
      },
      include: [{
        model: PropertyModel,
        as: 'property',
        attributes: ['id', 'title', 'address', 'price'],
      }]
    })

    // 返回查询结果
    return res.status(200).json({
      title: '搜索成功',
      data: orderItem
    })

  } catch (error) {
    res.status(500).json({ error: error.message })
  }
}

module.exports = {
  getOrderInfo,
  changeOrderStatus,
  deleteOrder,
  orderCount,
  searchOrder
}